package com.ppch.zerocodegenerator.ai.service;

import com.ppch.zerocodegenerator.ai.model.code_result.HtmlCodeResult;
import com.ppch.zerocodegenerator.ai.model.code_result.MultiFileCodeResult;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;
import reactor.core.publisher.Flux;

/**
 * Package:ZeroCodeGenerator
 * ClassName:AiCodeGeneratorService
 *
 * @Author 泡泡茶壶
 * @Create 2025/10/6 18:21
 * @Version 1.0
 * Description:
 * 代码生成 AI Service 接口
 * 1.定义AI对话接口，通过接口创建AiServices实例，实现与AI进行交互
 * 2.结构化输出（注意：流式输出时不支持结构化输出）
 * 实现方式：将接口返回值设置为自定义实体类即可实现结构化输出
 * 实现原理：在AI生成回答时要求AI生成对应实体类格式的JSON字符串，通过反序列化JSON字符串为自定义实体类对象
 * 添加的约束条件：You must answer strictly in the following JSON format: {"htmlCode": (type: string),......}"
 */
public interface AiCodeGeneratorService {

    /**
     * 根据用户描述生成原生 HTML 代码（css、html、js在同一个.html文件中）
     * @param userMessage 用户 Prompt
     * @return AI 响应结果
     */
    @SystemMessage(fromResource = "prompt/generator-html-system-prompt.txt")
    HtmlCodeResult generateHtmlCode(@UserMessage String userMessage);

    /**
     * 根据用户描述生成多文件 HTML 代码（css、html、js三个文件）
     * @param userMessage 用户 Prompt
     * @return AI 响应结果
     */
    @SystemMessage(fromResource = "prompt/generator-multi-file-system-prompt.txt")
    MultiFileCodeResult generateMultiFileCode(@UserMessage String userMessage);

    /**
     * 流式响应接口
     * 根据用户描述生成原生 HTML 代码（css、html、js在同一个.html文件中）
     * @param userMessage 用户 Prompt
     * @return AI 响应结果
     */
    @SystemMessage(fromResource = "prompt/generator-html-system-prompt.txt")
    Flux<String> generateHtmlCodeWithStream(@UserMessage String userMessage);

    /**
     * 流式响应接口
     * 根据用户描述生成多文件 HTML 代码（css、html、js三个文件）
     * @param userMessage 用户 Prompt
     * @return AI 响应结果
     */
    @SystemMessage(fromResource = "prompt/generator-multi-file-system-prompt.txt")
    Flux<String> generateMultiFileCodeWithStream(@UserMessage String userMessage);

    /**
     * 流式响应接口
     * 根据用户描述生成 Vue 项目代码
     * @param userMessage 用户 Prompt
     * @param appId 应用ID，该ID参数需要传给工具，所以使用 @MemoryId 标记
     * @return AI 响应结果
     */
    @SystemMessage(fromResource = "prompt/generator-vue-project-system-prompt.txt")
    TokenStream generateVueProjectCodeWithStream(@UserMessage String userMessage, @MemoryId long appId);
}
